package qf.index;

import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Dept {

    /**
     * 本程序的功能是处理与科室相关的问题，包括生成中、英两张科室基础表，此两张表通过通义规范成复旦和STEM的标准名称。并对外提供以下两个方法：
     * 1、获取科室信息，getDept(String full, Set<String> deptSet, Set<String> dellSet, Map<String, String> standardMap)
     * 2、执行通义规范科室，tongYiDeptName(String basicDeptTable, String autoId, String field, String user, int min, int max)
     * 3、使用通义时，是通过d1、d2、d3、d4、u1、u2、u3、u4方法，均分成4份一起跑的，d1等方法，不在本方法内。
     * 贾新志 2025.02.19
     */

    public static void main(String[] args) throws SQLException {

        basicDept();


    }

    public static void basicDept() throws SQLException {
        String newDataName = "scholar_25_02.";
        String summaryTable = newDataName + "unified_search_summary_0120";
        String cnBasicDeptTable = newDataName + "cn_basic_hosp_dept";
        String enBasicDeptTable = newDataName + "en_basic_hosp_dept";
        String htLocationChinaTable = newDataName + "ht_location_china";
        String basicUnivCollTable = newDataName + "basic_univ_coll";
        String collInfoSumTable = newDataName + "coll_info_sum";
        String notCollInfoSumTable = newDataName + "not_coll_info_sum";
        String allInfoSumTable = newDataName + "all_info_sum";

        // 这个是基于总表的2000年以来的中文数据。
//        doCnDeptTable(summaryTable, "id", "year`,`c1_au", cnBasicDeptTable, htLocationChinaTable);

        // 这个是基于总表的近6年的含有医院以及部分医学中心（md anderson cancer center或sheba medical center）和诊所（mayo clinical或cleveland clinical）的数据，作为医院科室的基础数据。
//        doEnDeptTable(summaryTable, "id", "year`,`c1_au", enBasicDeptTable);

//        doUnivTable(summaryTable, "id", "year`,`c1_au", basicUnivCollTable, collInfoSumTable, notCollInfoSumTable, allInfoSumTable);

    }

    public static void tongYiDeptName(String basicDeptTable, String autoId, String field, String user, int min, int max) throws SQLException {
        // 通义翻译机构的中文名字，最多翻译5次，如果5次仍失败就不再处理了。翻译后的转为实体类，只有在实体有值的时候才认为是成功，不成功则追加一次。翻译的对象为复旦排行榜和STEM的科室名称。如果匹配不上，允许阿里推荐一个，推荐的加的有方括号。
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 1000;
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + basicDeptTable);
        Set<String> stemSet = uSet.getStemSet();
        Set<String> fuDanSet = uSet.getFuDanSet();
        String fuDans = "- 病理科 - 传染感染 - 耳鼻喉科 - 放射科 - 呼吸科 - 风湿病 - 妇产科 - 骨科 - 精神医学 - 口腔科 - 麻醉科 - 泌尿外科 - 内分泌 - 皮肤科 - 普通外科 - 神经内科 - 肾脏病 - 神经外科 - 消化病 - 小儿内科 - 小儿外科 - 心血管病 - 心外科 - 胸外科 - 血液学 - 眼科 - 整形外科 - 肿瘤学 - 老年医学 - 康复医学 - 检验医学 - 烧伤科 - 核医学 - 超声医学 - 急诊医学 - 重症医学 - 临床药学 - 生殖医学 - 变态反应 - 健康管理 - 结核病 - 全科医学 - 疼痛学 - 运动医学 - 罕见病";
        String stems = "- 麻醉学 - 心血管病学 - 呼吸病学 - 结核病学 - 消化病学 - 血液病学 - 肾脏病学 - 内分泌病学与代谢病学 - 风湿病学与自体免疫病学 - 变态反应学 - 传染病学 - 普通外科学 - 神经外科学 - 超声医学 - 放射学 - 核医学 - 护理学 - 肿瘤学 - 急诊医学 - 危重症医学 - 精神病学 - 神经病学 - 皮肤病学 - 口腔医学 - 耳鼻喉科学 - 眼科学 - 儿科学 - 妇产科学 - 整形外科学 - 烧伤外科学 - 骨外科学 - 泌尿外科学 - 心血管外科学 - 胸外科学";
        if (tableNum.get(0).getInt("count") > 0) {
            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + basicDeptTable).intValue();
            Collection<Integer> tableList = new ArrayList<>();
            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
            for (Integer startId : tableList) {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + basicDeptTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
//                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + basicDeptTable + Utils.printMemoryStr() + "\033[0m");
                for (Entity entry : tableData) {
                    String info = Utils.getStrField(entry, "info");
                    String fuDan = Utils.getStrField(entry, "fudan");
                    String stem = Utils.getStrField(entry, "stem");
                    String youDao = Utils.getStrField(entry, "you_dao");
                    int id = Utils.getIntField(entry, autoId);
                    int sum = Utils.getIntField(entry, "hosp_sum");
                    int end = id > 10 ? Integer.parseInt(Integer.toString(id).substring(Integer.toString(id).length() - 2)) : id;
                    if ((fuDan.isEmpty() || "1".equals(fuDan) || "2".equals(fuDan) || stem.isEmpty() || "1".equals(stem) || "2".equals(stem)) && !info.isEmpty() && id > 0 && (end >= min && end <= max) && sum > 9) {
                        try {
                            youDao = Utils.isContainChinese(info) ? ("--" + info + "--") : youDao;
                            youDao = youDao.length() < 4 ? TransApi.youDaoEnToCnTrans(info) : youDao;
                            String upDataFuDan = fuDanSet.contains(info) ? info : getUpData(fuDan, info, fuDans, user);
                            String upDataStem = stemSet.contains(info) ? info : getUpData(stem, info, stems, user);
                            System.out.println(format.format(new Date()) + " " + id + ": " + info + "--fuDan--" + upDataFuDan + "--stem--" + upDataStem + "~~~~" + youDao);
                            try {
                                Db.use().update(Entity.create().set("fudan", upDataFuDan).set("stem", upDataStem).set("you_dao", youDao).set("datetime", LocalDateTime.now()), Entity.create(basicDeptTable).set(autoId, id));
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        } catch (Exception e) {
//                                throw new RuntimeException(e);
                        }
                    }
                }
            }
        }
    }

    public static void tongYiUnivColl(String basicUnivCollTable, String autoId, String field, String user, int min, int max) throws SQLException {
        // 通义翻译机构的中文名字，最多翻译5次，如果5次仍失败就不再处理了。翻译后的转为实体类，只有在实体有值的时候才认为是成功，不成功则追加一次。翻译的对象为复旦排行榜和STEM的科室名称。如果匹配不上，允许阿里推荐一个，推荐的加的有方括号。
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 1000;
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + basicUnivCollTable);
        Map<String, En.Edu> eduSubJectMap = Dept.getEduSubJectMap();
        if (tableNum.get(0).getInt("count") < 1) {
            return;
        }
        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + basicUnivCollTable).intValue();
        Collection<Integer> tableList = new ArrayList<>();
        NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
        for (Integer startId : tableList) {
            List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + basicUnivCollTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
            for (Entity entry : tableData) {
                String info = Utils.getStrField(entry, "info");
                String edu = Utils.getStrField(entry, "edu");
                String youDao = Utils.getStrField(entry, "you_dao");
                int id = Utils.getIntField(entry, autoId);
                int sum = Utils.getIntField(entry, "univ_sum");
                int end = id > 10 ? Integer.parseInt(Integer.toString(id).substring(Integer.toString(id).length() - 2)) : id;
                if ((edu.isEmpty() || "1".equals(edu) || "2".equals(edu)) && !info.isEmpty() && id > 0 && (end >= min && end <= max) && sum > 92) {
                    youDao = Utils.isContainChinese(info) ? ("--" + info + "--") : youDao;
                    youDao = youDao.length() < 4 ? TransApi.youDaoEnToCnTrans(info) : youDao;
                    String sendForJson = TongYiApi.sendSubjectJson(info, user);
                    Matcher unitMatcher = Pattern.compile("\"subject\"\\s*:\\s*\"([^\"]*)\"").matcher(sendForJson);
                    String subject = unitMatcher.find() ? unitMatcher.group(1).trim() : "";
                    System.out.println(format.format(new Date()) + " " + id + ": " + info + "----" + subject + "~~~~" + youDao);
                    if (eduSubJectMap.containsKey(subject)) {
                        edu = JSONUtil.toJsonStr(eduSubJectMap.get(subject));
                    } else {
                        if (edu.isEmpty()) {
                            edu = "1";
                        } else if ("1".equals(edu)) {
                            edu = "2";
                        } else if ("2".equals(edu)) {
                            edu = "3";
                        }
                    }
                    try {
                        Db.use().update(Entity.create().set("edu", edu).set("you_dao", youDao).set("datetime", LocalDateTime.now()), Entity.create(basicUnivCollTable).set(autoId, id));
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void doUnivTable(String summaryTable, String autoId, String field, String basicUnivCollTable, String collInfoSumTable, String notCollInfoSumTable, String allInfoSumTable) throws SQLException {
        // 这个是基于总表的近6年的含有医院以及部分医学中心（md anderson cancer center或sheba medical center）和诊所（mayo clinical或cleveland clinical）的数据，作为医院科室的基础数据。
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 1000;
        String limit = "";
//        String limit = " limit 1";
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + summaryTable);
        Db.use().execute("truncate table " + basicUnivCollTable);
        if (tableNum.get(0).getInt("count") < 1) {
            return;
        }
        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryTable).intValue();
        Collection<Integer> tableList = new ArrayList<>();
        NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
        Map<String, Integer> collAndSumMap = new ConcurrentHashMap<>();
        Map<String, Integer> notCollAndSumMap = new ConcurrentHashMap<>();
        Map<String, Set<String>> collAndinfoSetMap = new ConcurrentHashMap<>();
        Set<String> collSet = uSet.getCollSet();
        Set<String> univSet = uSet.getUnivSet();
        Set<String> removeSet = uSet.getRemoveSet();
        tableList.parallelStream().forEach(startId -> {
            try {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1) + limit);
                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + summaryTable + Utils.printMemoryStr() + "\033[0m");
                for (Entity entry : tableData) {
                    String c1Au = Utils.getStrField(entry, "c1_au");
                    Integer year = entry.getInt("year");
                    if (null != year && year > 2018) {
                        List<En.C1Auth> c1List = (c1Au.contains("sort")) ? JSONObject.parseArray(c1Au, En.C1Auth.class) : new ArrayList<>();
                        for (En.C1Auth c1Auth : c1List) {
                            String f = c1Auth.getFull().isEmpty() ? c1Auth.getInfo() : c1Auth.getFull();
                            Set<String> cnEnCollSet = new HashSet<>();
                            boolean isUniv = false;
                            Set<String> notCollSet = new HashSet<>();
                            String[] split = f.replace(". ", ", ").replace(";", ",").split(",");
                            for (String s : split) {
                                String t = s.trim();
                                String l = " " + t.toLowerCase() + " ";
                                if (Unit.isAbbrUniv(t) || Unit.isUniv(t.toLowerCase(), univSet, removeSet) || t.contains("大学") || t.contains("学院") || t.contains("学校") || t.contains("karolinska institutet") || t.contains("karolinska inst")) {
                                    isUniv = true;
                                }
                                if (t.contains("大学") && t.length() > (t.indexOf("大学") + 3)) {
                                    cnEnCollSet.add(t.substring(t.indexOf("大学") + 2));
                                } else if (t.contains("学院") && t.length() > (t.indexOf("学院") + 3)) {
                                    cnEnCollSet.add(t.substring(t.indexOf("学院") + 2));
                                } else if (t.contains("学校") && t.length() > (t.indexOf("学校") + 3)) {
                                    cnEnCollSet.add(t.substring(t.indexOf("学校") + 2));
                                } else if (isUnivColl(l) || Unit.isColl(t.toLowerCase(), collSet, removeSet)) {
                                    cnEnCollSet.add(l.trim());
                                } else if (!NumberUtil.isInteger(t) && !Pattern.compile("[0-9]{3,6}").matcher(t).find()) {
                                    if (Utils.isContainChinese(t)) {
                                        notCollSet.add(t);
                                    } else if (t.contains(" ")) {
                                        notCollSet.add(t);
                                    }
                                }
                            }
                            if (isUniv) {
                                for (String e : cnEnCollSet) {
                                    collAndSumMap.compute(e, (key, value) -> value != null ? (value + 1) : 1);
                                    putStrSetStrLen(e, f, collAndinfoSetMap);
                                }
                                for (String s : notCollSet) {
                                    notCollAndSumMap.compute(s, (key, value) -> value != null ? (value + 1) : 1);
                                }
                            }
                        }
                    }
                }
            } catch (SQLException e) {
//                throw new RuntimeException(e);
            }
        });
        collAndinfoSetMap.keySet().parallelStream().forEach(coll -> {
            try {
                Db.use().insert(Entity.create(basicUnivCollTable).set("info", coll).set("c1s", JSONUtil.toJsonStr(collAndinfoSetMap.get(coll)))
                        .set("sum", collAndSumMap.getOrDefault(coll, 1)).set("type", (coll.toLowerCase().replace("college", "department")
                                .replace("school", "department").replace("faculty", "department").contains("department") || coll.contains("学院")) ? 1 : 0));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });
        insertSumTable(collInfoSumTable, collAndSumMap);
        insertSumTable(notCollInfoSumTable, notCollAndSumMap);
    }

    public static boolean isUnivColl(String l) {
        return l.contains("department") || l.contains("division") || l.contains("center") || l.contains("school") || l.contains("seminary") || l.contains("conservatory") || l.contains("departmental unit") || l.contains("research institute") || l.contains("laboratory") ||
                l.contains(" unit ") || l.contains(" hall ") || l.contains("college") || l.contains("faculty") || l.contains("polytechnic") || l.contains("program") || l.contains("centre") || l.contains("conservatoire") || l.contains("institute") || l.contains("academy") ||
                l.contains("biomedical science") || l.contains("business administration") || l.contains("cardiology section") || l.contains("cardiovascular medical section") || l.contains("cardiovascular medicine") || l.contains("central laboratories") ||
                l.contains("chemistry and biochemistry") || l.contains("chemistry research laboratories") || l.contains("chinese ministry of education") || l.contains("civil and electrical engineering") || l.contains("clinical dermatology") ||
                l.contains("clinical medicine") || l.contains("clinical neurochemistry laboratories") || l.contains("clinical neurology") || l.contains("clinical psychology") || l.contains("clinical science") || l.contains("computer science") ||
                l.contains("computer science and electrical engineering") || l.contains("dermatology section") || l.contains("dermatology service") || l.contains("education ministry china") || l.contains("electrical engineering") ||
                l.contains("electrical material research laboratories") || l.contains("emergency medical") || l.contains("expert panel on fragrance safety") || l.contains("eye clinic") || l.contains("family medicine") || l.contains("gastroenterology and hepatology") ||
                l.contains("health campus") || l.contains("health science") || l.contains("hematology and oncology") || l.contains("hematology section") || l.contains("hematology service") || l.contains("infectious diseases section") || l.contains("internal medicine service") ||
                l.contains("international joint laboratories for food safety") || l.contains("international relations") || l.contains("material research laboratories") || l.contains("mathematics section") || l.contains("mechanical electrical") || l.contains("medical genetics") ||
                l.contains("medical oncol") || l.contains("member expert panel on fragrance safety") || l.contains("microbiology laboratories") || l.contains("microbiology service") || l.contains("ministry of health") || l.contains("natural history museum of denmark") ||
                l.contains("nature historical museum denmark") || l.contains("neurology service") || l.contains("nuclear medicine") || l.contains("obstetrics and gynaecology") || l.contains("oral and maxillofacial surgeons") || l.contains("orthopedic surgeons") ||
                l.contains("pediatric clinical") || l.contains("pediatrics service") || l.contains("pharmacology laboratories") || l.contains("pneumology service") || l.contains("political science") || l.contains("psychiatry section") || l.contains("public health") ||
                l.contains("pulmonary and critical care medicine") || l.contains("respiratory medicine") || l.contains("rheumatology service") || l.contains("school of nursing") || l.contains("science & research branch") || l.contains("social work") ||
                l.contains("space science laboratories") || l.contains("urology service") || l.contains("amsterdam neurosci") || l.contains("anschutz medical campus") || l.contains("applied physical laboratories") || l.contains("assistant professor") ||
                l.contains("biomed electrical") || l.contains("biomed science") || l.contains("cardiovasc medical") || l.contains("chemistry & biochemistry") || l.contains("chemistry electrical") || l.contains("chinese ministry education") ||
                l.contains("civil & environment electrical") || l.contains("civil electrical") || l.contains("cleveland clinical") || l.contains("clinical laboratories") || l.contains("clinical medical") || l.contains("clinical neurochem laboratories") ||
                l.contains("clinical psychol") || l.contains("computer science & electrical") || l.contains("dermatol clinical") || l.contains("electrical & electrical electrical") || l.contains("escola enfermagem") || l.contains("escola paulista medical") ||
                l.contains("escuela medical") || l.contains("expert panel fragrance safety") || l.contains("fragrance safety") || l.contains("eye clinical") || l.contains("family medical") || l.contains("gastroenterol & hepatol") || l.contains("general surgeons") ||
                l.contains("hematol oncol") || l.contains("infectious diseases") || l.contains("internal medical") || l.contains("international joint laboratories food safety") || l.contains("international relat") || l.contains("jet production laboratories") ||
                l.contains("key laboratories optoelect devices & system") || l.contains("key laboratories") || l.contains("laboratories medical") || l.contains("laboratories microbiol") || l.contains("laboratories pharmacol") || l.contains("laqv requimte") ||
                l.contains("material science & electrical") || l.contains("medical fakultat") || l.contains("medical genet") || l.contains("member expert panel fragrance safety") || l.contains("ministry science & technol") || l.contains("neurol clinical") ||
                l.contains("nuclear medical") || l.contains("obstetrics & gynaecol") || l.contains("obstetrics & gynecol") || l.contains("oral & maxillofacial surgeons") || l.contains("orthopaed surgeons") || l.contains("pediat clinical") ||
                l.contains("polit science") || l.contains("publ health") || l.contains("pulmonary & crit care medical") || l.contains("radiat oncol") || l.contains("respiratory medical") || l.contains("science life laboratories") || l.contains("sect cardiol") ||
                l.contains("sect cardiovasc medical") || l.contains("sect dermatol") || l.contains("sect hematol") || l.contains("sect infectious diseases") || l.contains("sect mathematics") || l.contains("sect psychiatry") || l.contains("service cardiol") ||
                l.contains("service dermatol") || l.contains("service hematol") || l.contains("service medical interna") || l.contains("service microbiol") || l.contains("service neumol") || l.contains("service neurol") || l.contains("service pediat") ||
                l.contains("service pneumol") || l.contains("service reumatol") || l.contains("service urol") || l.contains("student research committee") || l.contains("tehran medical science") || l.contains("hospital") || l.contains("state key laboratories");
    }

    public static void insertSumTable(String notCollInfoSumTable, Map<String, Integer> notCollAndSumMap) throws SQLException {
        Db.use().execute("truncate table " + notCollInfoSumTable);
        notCollAndSumMap.keySet().parallelStream().forEach(info -> {
            try {
                Db.use().insert(Entity.create(notCollInfoSumTable).set("info", info).set("sum", notCollAndSumMap.get(info)));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });
    }

    public static void doEnDeptTable(String summaryTable, String autoId, String field, String enBasicDeptTable) throws SQLException {
        // 这个是基于总表的近6年的含有医院以及部分医学中心（md anderson cancer center或sheba medical center）和诊所（mayo clinical或cleveland clinical）的数据，作为医院科室的基础数据。
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 1000;
        String limit = "";
//        String limit = " limit 1";
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + summaryTable);
        Db.use().execute("truncate table " + enBasicDeptTable);
        Set<String> hospSet = getHospSet();
        if (tableNum.get(0).getInt("count") < 1) {
            return;
        }
        Set<String> dellSet = uSet.getDellSet();
        Set<String> deptSet = uSet.getDeptSet();
        Map<String, String> standardMap = new ConcurrentHashMap<>();
        Map<String, Set<String>> deptAndInfoSetMap = new ConcurrentHashMap<>();
        Map<String, Integer> deptAndSumMap = new ConcurrentHashMap<>();
        standardMap.put("department medical", "Department Medical");
        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryTable).intValue();
        Collection<Integer> tableList = new ArrayList<>();
        NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
        tableList.parallelStream().forEach(startId -> {
            try {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1) + limit);
                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + summaryTable + Utils.printMemoryStr() + "\033[0m");
                for (Entity entry : tableData) {
                    String c1Au = Utils.getStrField(entry, "c1_au");
                    Integer year = entry.getInt("year");
                    if (null != year && year > 2018) {
                        List<En.C1Auth> c1List = (c1Au.contains("sort")) ? JSONObject.parseArray(c1Au, En.C1Auth.class) : new ArrayList<>();
                        for (En.C1Auth c1Auth : c1List) {
                            String f = c1Auth.getFull().isEmpty() ? c1Auth.getInfo() : c1Auth.getFull();
                            String full = " " + f.toLowerCase().trim() + " ";
                            boolean bool = false;
                            for (String hosp : hospSet) {
                                // 这个不需要多么的精确，因为仅是作为科室的基础数据，用于规范复旦和STEM用的，多点少点影响不大。因此，不考虑类似"301hosp"或者"affiliatedhosp"或者医院的常见错误写法"hopsital"等。
                                hosp = " " + hosp.toLowerCase().trim() + " ";
                                if (full.contains(hosp) || full.trim().equals(hosp.trim())) {
                                    bool = true;
                                    break;
                                }
                            }
                            if (bool) {
                                // 如果是医院，且还是科室，则要。
                                Set<String> depts = getDept(f, deptSet, dellSet, standardMap, "[hosp]");
                                for (String dept : depts) {
                                    if (dept.length() > 7) {
                                        putStrSetStrLen(dept, f, deptAndInfoSetMap);
                                        deptAndSumMap.compute(dept, (key, value) -> value != null ? (value + 1) : 1);
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (SQLException e) {
//                throw new RuntimeException(e);
            }
        });
        deptAndInfoSetMap.keySet().parallelStream().forEach(dept -> {
            try {
                Db.use().insert(Entity.create(enBasicDeptTable).set("info", dept).set("c1s", JSONUtil.toJsonStr(deptAndInfoSetMap.get(dept)))
                        .set("sum", deptAndSumMap.getOrDefault(dept, 1)).set("type", dept.toLowerCase().contains("department") ? 1 : 0));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });
    }

    public static void doCnDeptTable(String summaryTable, String autoId, String field, String cnBasicDeptTable, String htLocationChinaTable) throws SQLException {
        // 这里是整个utArticle表中的近6年的含有医院以及部分医学中心（md anderson cancer center或sheba medical center）和诊所（mayo clinical或cleveland clinical）的数据，作为医院科室的基础数据。
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 1000;
        String limit = "";
//        String limit = " limit 1";
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + summaryTable);
        Db.use().execute("truncate table " + cnBasicDeptTable);
        if (tableNum.get(0).getInt("count") < 1) {
            return;
        }
        Set<String> citySet = new HashSet<>();
        Set<String> provCitySet = getProvCitySet(htLocationChinaTable, "id", "prov`,`name", citySet);
        Map<String, Set<String>> deptAndInfoSetMap = new ConcurrentHashMap<>();
        Map<String, Integer> deptAndSumMap = new ConcurrentHashMap<>();
        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryTable).intValue();
        Collection<Integer> tableList = new ArrayList<>();
        NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
        tableList.parallelStream().forEach(startId -> {
            try {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1) + limit);
                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + summaryTable + Utils.printMemoryStr() + "\033[0m");
                for (Entity entry : tableData) {
                    String c1Au = Utils.getStrField(entry, "c1_au");
                    Integer year = entry.getInt("year");
                    if (null != year && year > 1999 && isHosp(c1Au)) {
                        List<En.C1Auth> c1List = (c1Au.contains("sort")) ? JSONObject.parseArray(c1Au, En.C1Auth.class) : new ArrayList<>();
                        for (En.C1Auth c1Auth : c1List) {
                            String info = c1Auth.getInfo();
                            if (isHosp(info)) {
                                String[] split = info.replace("，", ",").replace("；", ",").replace("。", ",").replace("、", ",").replace("\\", ",")
                                        .replace("/", ",").replace(";", ",").split(",");
                                for (String s : split) {
                                    if (s.length() > 5) {
                                        String t = s.replace("医院\\)", "医院)ĺļ").replace("癌症中心", "癌症中心ĺļ").replace("病研究所", "病研究所ĺļ").replace("儿科研究所", "儿科研究所ĺļ")
                                                .replace("妇婴保健院", "妇婴保健院ĺļ").replace("急救中心", "急救中心ĺļ").replace("健康中心", "健康中心ĺļ").replace("精神病院", "精神病院ĺļ")
                                                .replace("临床中心", "临床中心ĺļ").replace("卫生中心", "卫生中心ĺļ").replace("医疗救治中心", "医疗救治中心ĺļ").replace("医院", "医院ĺļ")
                                                .replace("医疗中心", "医疗中心ĺļ").replace("医学中心", "医学中心ĺļ").replace("预防控制中心", "预防控制中心ĺļ").replace("&amp", "");
                                        if (t.contains("ĺļ")) {
                                            String dept = t.substring(t.lastIndexOf("ĺļ") + "ĺļ".length()).replace("ĺļ", "").replace("（", "(").replace("）", ")").trim();
                                            dept = dept.replace("１", "1").replace("２", "2").replace("３", "3").replace("４", "4").replace("５", "5")
                                                    .replace("６", "6").replace("７", "7").replace("８", "8").replace("９", "9").replace("０", "0");
                                            dept = (dept.contains("医院)")) ? dept.substring(dept.indexOf("医院)") + "医院)".length()).trim() : dept.trim();
                                            dept = (dept.contains("医院")) ? dept.substring(dept.indexOf("医院") + "医院".length()).trim() : dept.trim();
                                            dept = dept.startsWith("东院") || dept.startsWith("西院") || dept.startsWith("南院") || dept.startsWith("北院") ? dept.substring(2).trim() : dept;
                                            dept = dept.startsWith("：") || dept.startsWith(")") || dept.startsWith("-") || dept.startsWith(":") || dept.startsWith("·") || dept.startsWith("&") || dept.startsWith(".") ? dept.substring(1).trim() : dept;
                                            dept = dept.startsWith("(") && dept.endsWith(")") ? dept.substring(1, dept.length() - 1).trim() : dept;
                                            // 删除省份加城市，一种是省份和城市之间有一个空格，一种是没有空格。
                                            if (dept.length() > 6) {
                                                for (String provCity : provCitySet) {
                                                    dept = dept.replace(provCity, "").trim();
                                                    dept = dept.replace(provCity.replace(" ", ""), "");
                                                }
                                            }
                                            dept = dept.replaceAll(" +", " ").replace("( )", "").replace("()", "").trim();
                                            dept = dept.startsWith("(") && dept.endsWith(")") ? dept.substring(1, dept.length() - 1).trim() : dept;
                                            // 获取6位的邮编，并用城市加邮编的方式给予删除。
                                            Matcher matcher = Pattern.compile("[0-9]{6}").matcher(dept);
                                            String postal = "";
                                            while (matcher.find()) {
                                                postal = matcher.group();
                                            }
                                            if (!postal.isEmpty()) {
                                                for (String city : citySet) {
                                                    dept = dept.replace(city + " " + postal, "").trim();
                                                    dept = dept.replace(city + postal, "").trim();
                                                    dept = dept.replace(postal + " " + city, "").trim();
                                                    dept = dept.replace(postal + city, "").trim();
                                                }
                                            }
                                            dept = dept.replaceAll(" +", " ").replace("( )", "").replace("()", "").trim();
                                            for (String city : citySet) {
                                                dept = dept.startsWith(city) ? dept.substring(city.length()).trim() : dept;
                                                dept = dept.endsWith(city) ? dept.substring(0, dept.length() - city.length()).trim() : dept;
                                                dept = dept.endsWith(city + "市") ? dept.substring(0, dept.length() - city.length() - 1).trim() : dept;
                                                dept = dept.replace("( ", "(").replace(" )", ")").replace("(" + city + ")", "");
                                            }
                                            dept = dept.replaceAll(" +", " ").replace("( )", "").replace("()", "").trim();
                                            dept = dept.replaceAll("(.+?)[0-9]{6}$", "$1").trim();
                                            dept = dept.replaceAll("(.+?)[() 0-9]{8,10}$", "$1").trim();
                                            dept = dept.replaceAll("^\\(.+?[院团区市所地]\\)(.+?)$", "$1").trim();
                                            dept = dept.startsWith("东院") || dept.startsWith("西院") || dept.startsWith("南院") || dept.startsWith("北院") ? dept.substring(2).trim() : dept;
                                            dept = dept.startsWith("(") && dept.endsWith(")") ? dept.substring(1, dept.length() - 1).trim() : dept;
                                            dept = dept.endsWith("：") || dept.endsWith("(") || dept.endsWith("-") || dept.endsWith(":") || dept.endsWith("·") || dept.endsWith("!") || dept.endsWith(".") ? dept.substring(0, dept.length() - 1).trim() : dept;
                                            dept = !dept.contains("(") && dept.endsWith(")") ? dept.substring(0, dept.length() - 1).trim() : dept;
                                            if (dept.length() > 1 && !NumberUtil.isInteger(dept)) {
                                                putStrSetStrLen(dept, info, deptAndInfoSetMap);
                                                deptAndSumMap.compute(dept, (key, value) -> value != null ? (value + 1) : 1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (SQLException e) {
//                throw new RuntimeException(e);
            }
        });
        deptAndInfoSetMap.keySet().parallelStream().forEach(dept -> {
            try {
                Db.use().insert(Entity.create(cnBasicDeptTable).set("info", dept).set("c1s", JSONUtil.toJsonStr(deptAndInfoSetMap.get(dept)))
                        .set("sum", deptAndSumMap.getOrDefault(dept, 1)));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });
    }

    public static void getCnDept(String full, Set<String> provCitySet, Set<String> deptSet, Set<String> citySet, Set<String> unitSet) throws SQLException {
        if (null == unitSet || unitSet.isEmpty()) {
            return;
        }
        for (String s : unitSet) {
            full = full.replace(s, "Łł" + s);
        }
//        System.out.println("unitSet: " + unitSet + " full:" + full);
        String[] fulls = full.split("Łł");
        for (String f : fulls) {
            if (f.length() < 6) {
                continue;
            }
            boolean isCnHosp = f.contains("医院") || f.contains("疾病预防控制中心") || f.contains("肿瘤防治中心") || f.contains("预防控制中心") || f.contains("医疗救治中心") || f.contains("眼病防治中心") || f.contains("血液病研究所") ||
                    f.contains("传染病防治院") || f.contains("眼科研究所") || f.contains("心肺研究所") || f.contains("肾病研究所") || f.contains("妇幼保健院") || f.contains("妇婴保健院") || f.contains("妇女保健院") ||
                    f.contains("儿科研究所") || f.contains("癌症研究所") || f.contains("诊疗中心") || f.contains("医学中心") || f.contains("医疗中心") || f.contains("眼科中心") || f.contains("卫生中心") || f.contains("体检中心") ||
                    f.contains("临床中心") || f.contains("精神病院") || f.contains("健康中心") || f.contains("急救中心") || f.contains("病研究所") || f.contains("保健中心") || f.contains("癌症中心") || f.contains("防疫站") || f.contains("医 院");
            boolean isCnUniv = f.contains("大学") || f.contains("学院") || f.contains("学校");
            String[] split = f.replace("，", ",").replace("；", ",").replace("。", ",").replace("、", ",").replace("\\", ",")
                    .replace("/", ",").replace(";", ",").split(",");
//            System.out.println("f: " + f);
            for (String s : split) {
//                System.out.println("s: " + s);
                if (s.length() > 5) {
                    String t = s.replace("&amp", "");
                    if (t.contains("医院")) {
                        t = t.replace("医院", "医院ĺļ");
                    } else if (t.contains("医 院")) {
                        t = t.replace("医 院", "医 院ĺļ");
                    } else if (t.contains("大学")) {
                        t = t.replace("大学", "大学ĺļ");
                    } else if (t.contains("学校")) {
                        t = t.replace("学校", "学校ĺļ");
                    } else if (t.contains("学院")) {
                        t = t.replaceFirst("学院", "学院ĺļ");
                    } else {
                        t = t.replace("疾病预防控制中心", "疾病预防控制中心ĺļ").replace("肿瘤防治中心", "肿瘤防治中心ĺļ").replace("预防控制中心", "预防控制中心ĺļ").replace("医疗救治中心", "医疗救治中心ĺļ")
                                .replace("眼病防治中心", "眼病防治中心ĺļ").replace("血液病研究所", "血液病研究所ĺļ").replace("传染病防治院", "传染病防治院ĺļ").replace("眼科研究所", "眼科研究所ĺļ")
                                .replace("心肺研究所", "心肺研究所ĺļ").replace("肾病研究所", "肾病研究所ĺļ").replace("妇幼保健院", "妇幼保健院ĺļ").replace("妇婴保健院", "妇婴保健院ĺļ")
                                .replace("妇女保健院", "妇女保健院ĺļ").replace("儿科研究所", "儿科研究所ĺļ").replace("癌症研究所", "癌症研究所ĺļ").replace("诊疗中心", "诊疗中心ĺļ")
                                .replace("医学中心", "医学中心ĺļ").replace("医疗中心", "医疗中心ĺļ").replace("眼科中心", "眼科中心ĺļ").replace("卫生中心", "卫生中心ĺļ")
                                .replace("体检中心", "体检中心ĺļ").replace("临床中心", "临床中心ĺļ").replace("精神病院", "精神病院ĺļ").replace("健康中心", "健康中心ĺļ")
                                .replace("急救中心", "急救中心ĺļ").replace("病研究所", "病研究所ĺļ").replace("保健中心", "保健中心ĺļ").replace("癌症中心", "癌症中心ĺļ")
                                .replace("防疫站", "防疫站ĺļ");
                    }
                    if (t.contains("ĺļ")) {
//                        System.out.println("t: " + t);
                        String dept = t.substring(t.lastIndexOf("ĺļ") + "ĺļ".length()).replace("ĺļ", "").replace("（", "(").replace("）", ")").trim();
                        dept = dept.replace("１", "1").replace("２", "2").replace("３", "3").replace("４", "4").replace("５", "5")
                                .replace("６", "6").replace("７", "7").replace("８", "8").replace("９", "9").replace("０", "0");
                        dept = (dept.contains("医院)")) ? dept.substring(dept.indexOf("医院)") + "医院)".length()).trim() : dept.trim();
                        dept = (dept.contains("医院")) ? dept.substring(dept.indexOf("医院") + "医院".length()).trim() : dept.trim();
                        dept = dept.startsWith("东院") || dept.startsWith("西院") || dept.startsWith("南院") || dept.startsWith("北院") ? dept.substring(2).trim() : dept;
                        dept = dept.startsWith("：") || dept.startsWith(")") || dept.startsWith("-") || dept.startsWith(":") || dept.startsWith("·") || dept.startsWith("&") || dept.startsWith(".") ? dept.substring(1).trim() : dept;
                        dept = dept.startsWith("(") && dept.endsWith(")") ? dept.substring(1, dept.length() - 1).trim() : dept;
                        // 删除省份加城市，一种是省份和城市之间有一个空格，一种是没有空格。
                        if (dept.length() > 6) {
                            for (String provCity : provCitySet) {
                                dept = dept.replace(provCity, "").trim();
                                dept = dept.replace(provCity.replace(" ", ""), "");
                            }
                        }
                        dept = dept.replaceAll(" +", " ").replace("( )", "").replace("()", "").trim();
                        dept = dept.startsWith("(") && dept.endsWith(")") ? dept.substring(1, dept.length() - 1).trim() : dept;
                        // 获取6位的邮编，并用城市加邮编的方式给予删除。
                        Matcher matcher = Pattern.compile("[0-9]{6}").matcher(dept);
                        String postal = "";
                        while (matcher.find()) {
                            postal = matcher.group();
                        }
                        if (!postal.isEmpty()) {
                            for (String city : citySet) {
                                dept = dept.replace(city + " " + postal, "").trim();
                                dept = dept.replace(city + postal, "").trim();
                                dept = dept.replace(postal + " " + city, "").trim();
                                dept = dept.replace(postal + city, "").trim();
                            }
                        }
                        dept = dept.replaceAll(" +", " ").replace("( )", "").replace("()", "").trim();
                        for (String city : citySet) {
                            dept = dept.startsWith(city) ? dept.substring(city.length()).trim() : dept;
                            dept = dept.endsWith(city) ? dept.substring(0, dept.length() - city.length()).trim() : dept;
                            dept = dept.endsWith(city + "市") ? dept.substring(0, dept.length() - city.length() - 1).trim() : dept;
                            dept = dept.replace("( ", "(").replace(" )", ")").replace("(" + city + ")", "");
                        }
                        dept = dept.replaceAll(" +", " ").replace("( )", "").replace("()", "").trim();
                        dept = dept.replaceAll("(.+?)[0-9]{6}$", "$1").trim();
                        dept = dept.replaceAll("(.+?)[() 0-9]{8,10}$", "$1").trim();
                        dept = dept.replaceAll("^\\(.+?[院团区市所地]\\)(.+?)$", "$1").trim();
                        dept = dept.startsWith("东院") || dept.startsWith("西院") || dept.startsWith("南院") || dept.startsWith("北院") ? dept.substring(2).trim() : dept;
                        dept = dept.startsWith("(") && dept.endsWith(")") ? dept.substring(1, dept.length() - 1).trim() : dept;
                        dept = dept.endsWith("：") || dept.endsWith("(") || dept.endsWith("-") || dept.endsWith(":") || dept.endsWith("·") || dept.endsWith("!") || dept.endsWith(".") ? dept.substring(0, dept.length() - 1).trim() : dept;
                        dept = !dept.contains("(") && dept.endsWith(")") ? dept.substring(0, dept.length() - 1).trim() : dept;
                        if (dept.length() > 1 && !NumberUtil.isInteger(dept)) {
                            if (isCnHosp) {
                                deptSet.add("[hosp]" + dept);
                            }
                            if (isCnUniv) {
                                deptSet.add("[univ]" + dept);
                            }
                        }
                    }
                }
            }
        }
    }

    //if (Unit.isAbbrUniv(t) || Unit.isUniv(t.toLowerCase(), univSet, removeSet) || t.contains("大学") || t.contains("学院") || t.contains("学校") || t.contains("karolinska institutet") || t.contains("karolinska inst")) {
//                                    isUniv = true;
//                                }
//                                if (t.contains("大学") && t.length() > (t.indexOf("大学") + 3)) {
//                                    cnEnCollSet.add(t.substring(t.indexOf("大学") + 2));
//                                } else if (t.contains("学院") && t.length() > (t.indexOf("学院") + 3)) {
//                                    cnEnCollSet.add(t.substring(t.indexOf("学院") + 2));
//                                } else if (t.contains("学校") && t.length() > (t.indexOf("学校") + 3)) {
//                                    cnEnCollSet.add(t.substring(t.indexOf("学校") + 2));
//                                } else if (isUnivColl(l) || Unit.isColl(t.toLowerCase(), collSet, removeSet)) {
//                                    cnEnCollSet.add(l.trim());
//                                } else if (!NumberUtil.isInteger(t) && !Pattern.compile("[0-9]{3,6}").matcher(t).find()) {
//                                    if (Utils.isContainChinese(t)) {
//                                        notCollSet.add(t);
//                                    } else if (t.contains(" ")) {
//                                        notCollSet.add(t);
//                                    }
//                                }
    public static Set<String> getProvCitySet(String htLocationChinaTable, String autoId, String field, Set<String> citySet) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 1000;
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + htLocationChinaTable);
        Set<String> provCitySet = new HashSet<>();
        if (tableNum.get(0).getInt("count") > 0) {
            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + htLocationChinaTable).intValue();
            Collection<Integer> tableList = new ArrayList<>();
            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
            for (Integer startId : tableList) {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + htLocationChinaTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
                for (Entity entry : tableData) {
                    String prov = Utils.getStrField(entry, "prov");
                    String name = Utils.getStrField(entry, "name");
                    if (prov.length() > 1 && name.length() > 1 && !prov.equals(name)) {
                        provCitySet.add(prov + " " + name);
                        citySet.add(prov);
                        citySet.add(name);
                    }
                }
            }
        }
        return provCitySet;
    }

    public static boolean isHosp(String s) {
        return s.contains("医院") || s.contains("癌症中心") || s.contains("病研究所") || s.contains("儿科研究所") || s.contains("妇婴保健院") || s.contains("急救中心") ||
                s.contains("健康中心") || s.contains("精神病院") || s.contains("临床中心") || s.contains("卫生中心") || s.contains("医疗救治中心") || s.contains("医疗中心") || s.contains("医学中心") || s.contains("预防控制中心");
    }

//    public static void doHospTable(String utArticleTable, String autoId, String field, String tbTrueHosp6YearTable, String basicDeptTable) throws SQLException {
//        // 这里是整个utArticle表中的近6年的含有医院以及部分医学中心（md anderson cancer center或sheba medical center）和诊所（mayo clinical或cleveland clinical）的数据，作为医院科室的基础数据。
//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        int onePageNum = 1000;
//        String limit = "";
////        String limit = " limit 1";
//        List<Entity> tableNum = Db.use().query("select count(1) as count from " + utArticleTable);
//        Db.use().execute("truncate table " + tbTrueHosp6YearTable);
//        Db.use().execute("truncate table " + basicDeptTable);
//        Set<String> hospSet = getHospSet();
//        if (tableNum.get(0).getInt("count") < 1) {
//            return;
//        }
//        Set<String> dellSet = uSet.getDellSet();
//        Set<String> deptSet = uSet.getDeptSet();
//        Map<String, String> standardMap = new ConcurrentHashMap<>();
//        Map<String, Set<String>> deptAndInfoSetMap = new ConcurrentHashMap<>();
//        Map<String, Integer> deptAndSumMap = new ConcurrentHashMap<>();
//        standardMap.put("department medical", "Department Medical");
//        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + utArticleTable).intValue();
//        Collection<Integer> tableList = new ArrayList<>();
//        NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
//        tableList.parallelStream().forEach(startId -> {
//            try {
//                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + utArticleTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1) + limit);
//                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + utArticleTable + Utils.printMemoryStr() + "\033[0m");
//                for (Entity entry : tableData) {
//                    int id = Utils.getIntField(entry, autoId);
//                    String ut = Utils.getStrField(entry, "UT");
//                    String c1 = Utils.getStrField(entry, "C1");
//                    String rp = Utils.getStrField(entry, "RP");
//                    String py = Utils.getStrField(entry, "PY");
//                    ut = ut.toUpperCase().replace(" ", "").replace("WOS:", "").trim();
//                    if (("2019".equals(py) || "2020".equals(py) || "2021".equals(py) || "2022".equals(py) || "2023".equals(py) || "2024".equals(py) || "2025".equals(py)) && (c1.length() > 3 || rp.length() > 3) && id > 0 && ut.length() == 15) {
//                        List<En.C1Auth> c1List = Utils.getC1List(c1);
//                        List<En.C1Auth> rpList = Utils.getRpList(rp);
//                        List<En.C1Auth> changeRp = ChangeRp.rpChangeC1(c1List, rpList);
//                        List<String> deptList = new ArrayList<>();
//                        for (En.C1Auth c1Auth : c1List) {
//                            String f = c1Auth.getFull().isEmpty() ? c1Auth.getInfo() : c1Auth.getFull();
//                            String full = " " + f.toLowerCase().trim() + " ";
//                            boolean bool = false;
//                            for (String hosp : hospSet) {
//                                // 这个不需要多么的精确，因为仅是作为科室的基础数据，用于规范复旦和STEM用的，多点少点影响不大。因此，不考虑类似"301hosp"或者"affiliatedhosp"或者医院的常见错误写法"hopsital"等。
//                                hosp = " " + hosp.toLowerCase().trim() + " ";
//                                if (full.contains(hosp) || full.trim().equals(hosp.trim())) {
//                                    bool = true;
//                                    break;
//                                }
//                            }
//                            if (bool) {
//                                // 如果是医院，且还是科室，则要。
//                                Set<String> depts = getDept(f, deptSet, dellSet, standardMap);
//                                for (String dept : depts) {
//                                    if (dept.length() > 1) {
//                                        deptList.add(dept);
//                                        putStrSetStrLen(dept, f, deptAndInfoSetMap);
//                                        deptAndSumMap.compute(dept, (key, value) -> value != null ? (value + 1) : 1);
//                                    }
//                                }
//                            }
//                        }
//                        if (!deptList.isEmpty()) {
//                            try {
//                                Db.use().insert(Entity.create(tbTrueHosp6YearTable).set("ut", ut).set("C1", c1).set("RP", rp).set("py", Integer.parseInt(py)).set("c1_list", JSONUtil.toJsonStr(c1List))
//                                        .set("rp_list", JSONUtil.toJsonStr(rpList)).set("change_rp", JSONUtil.toJsonStr(changeRp)).set("dept_list", JSONUtil.toJsonStr(deptList)).set("pid", id));
//                            } catch (SQLException e) {
//                                e.printStackTrace();
//                            }
//                        }
//                    }
//                }
//            } catch (SQLException e) {

    /// /                throw new RuntimeException(e);
//            }
//        });
//        deptAndInfoSetMap.keySet().parallelStream().forEach(dept -> {
//            try {
//                Db.use().insert(Entity.create(basicDeptTable).set("info", dept).set("c1s", JSONUtil.toJsonStr(deptAndInfoSetMap.get(dept)))
//                        .set("sum", deptAndSumMap.getOrDefault(dept, 1)).set("type", dept.toLowerCase().contains("department") ? 1 : 0));
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        });
//    }
    public static void putStrSetStrLen(String name, String str, Map<String, Set<String>> strSetStrMap) {
        strSetStrMap.compute(name, (k, v) -> {
            if (v == null) {
                v = new ConcurrentHashSet<>();
            }
            if (v.size() < 101) {
                v.add(str);
            }
            return v;
        });
    }

    public static void getEnDept(String full, Set<String> enDeptSet, Set<String> subjectSet, Set<String> removeSet) {
        // type分为医院[hosp]和大学[univ]两种，使用时复旦和STEM只是医院下的某科室，而教育部的只能是某大学下的。
        String[] split = full.replace("；", ", ").replace("： ", ", ").replace("。", ", ").replace("， ", ", ")
                .replace("; ", ", ").replace(": ", ", ").replace(". ", ", ").split(", ");
        for (String t : split) {
            String s = t.toLowerCase().trim();
//            if (standardMap.containsKey(s)) {
//                t = standardMap.get(s);
//            } else {
//                standardMap.put(s, t);
//            }
            if (Unit.isSubject(s, subjectSet, removeSet)) {
                enDeptSet.add(t);
            }
        }
    }

    public static Set<String> getDept(String full, Set<String> deptSet, Set<String> dellSet, Map<String, String> standardMap, String type) {
        // type分为医院[hosp]和大学[univ]两种，使用时复旦和STEM只是医院下的某科室，而教育部的只能是某大学下的。
        String[] split = full.replace("；", ", ").replace("： ", ", ").replace("。", ", ").replace("， ", ", ")
                .replace("; ", ", ").replace(": ", ", ").replace(". ", ", ").split(", ");
        Set<String> result = new HashSet<>();
        for (String t : split) {
            String s = t.toLowerCase().trim();
            // 对于同时包含大学（或医院）和中心的，不能要。同时包含大学和医院的也不能要。
//            if ((s.contains("university") && s.contains("hospital")) || ((s.contains("university") || s.contains("hospital")) && s.contains("center"))) {
//                continue;
//            }
            if (standardMap.containsKey(s)) {
                t = standardMap.get(s);
            } else {
                standardMap.put(s, t);
            }
            if (!dellSet.contains(s)) {
                if (deptSet.contains(s)) {
                    result.add(t);
                }
                for (String d : deptSet) {
                    if (s.contains(d)) {
                        result.add(t);
                    }
                }
                String e = " " + s + " ";
                if (e.contains("amsterdam neurosci") || e.contains("anschutz medical campus") || e.contains("applied physical laboratories") || e.contains("biomed science") || e.contains("business administration") || e.contains("cardiology section") || e.contains("cardiovasc medical") ||
                        e.contains("cardiovascular medical section") || e.contains("cardiovascular medicine") || e.contains("central laboratories") || e.contains("chemistry & biochemistry") || e.contains("chemistry electrical") || e.contains("chemistry research laboratories") ||
                        e.contains("civil and electrical engineering") || e.contains("civil electrical") || e.contains("clinical dermatology") || e.contains("clinical laboratories") || e.contains("clinical medical") || e.contains("clinical neurochem laboratories") ||
                        e.contains("clinical neurochemistry laboratories") || e.contains("clinical neurology") || e.contains("clinical psychology") || e.contains("clinical science") || e.contains("computer science") || e.contains("computer science & electrical") ||
                        e.contains("conservatoire") || e.contains("conservatory") || e.contains("dermatol clinical") || e.contains("dermatology section") || e.contains("dermatology service") || e.contains("electrical & electrical electrical") || e.contains("electrical engineering") ||
                        e.contains("emergency medical") || e.contains("escola enfermagem") || e.contains("escola paulista medical") || e.contains("expert panel fragrance safety") || e.contains("expert panel on fragrance safety") || e.contains("eye clinic") || e.contains("eye clinical") ||
                        e.contains("family medical") || e.contains("family medicine") || e.contains("fragrance safety") || e.contains("gastroenterol & hepatol") || e.contains("gastroenterology and hepatology") || e.contains("general surgeons") || e.contains("health science") ||
                        e.contains("hematology and oncology") || e.contains("hematology section") || e.contains("hematology service") || e.contains("infectious diseases") || e.contains("infectious diseases section") || e.contains("internal medical") ||
                        e.contains("internal medicine service") || e.contains("international joint laboratories food safety") || e.contains("international relat") || e.contains("international relations") || e.contains("jet production laboratories") || e.contains("key laboratories") ||
                        e.contains("laboratories medical") || e.contains("laboratories microbiol") || e.contains("laboratories pharmacol") || e.contains("material research laboratories") || e.contains("mathematics section") || e.contains("mechanical electrical") || e.contains("medical genet") ||
                        e.contains("medical genetics") || e.contains("member expert panel fragrance safety") || e.contains("member expert panel on fragrance safety") || e.contains("microbiology laboratories") || e.contains("microbiology service") || e.contains("neurol clinical") ||
                        e.contains("neurology service") || e.contains("nuclear medicine") || e.contains("obstetrics & gynaecol") || e.contains("obstetrics & gynecol") || e.contains("obstetrics and gynaecology") || e.contains("oral & maxillofacial surgeons") ||
                        e.contains("oral and maxillofacial surgeons") || e.contains("orthopaed surgeons") || e.contains("orthopedic surgeons") || e.contains("pediat clinical") || e.contains("pediatrics service") || e.contains("pharmacology laboratories") || e.contains("pneumology service") ||
                        e.contains("political science") || e.contains(" polytechnic ") || e.contains("psychiatry section") || e.contains("publ health") || e.contains("public health") || e.contains("pulmonary & crit care medical") || e.contains("radiat oncol") || e.contains("respiratory medical") ||
                        e.contains("respiratory medicine") || e.contains("return department") || e.contains("rheumatology service") || e.contains("school of nursing") || e.contains("science & research branch") || e.contains("science life laboratories") || e.contains("sect cardiol") ||
                        e.contains("sect dermatol") || e.contains("sect hematol") || e.contains("sect infectious diseases") || e.contains("sect mathematics") || e.contains("sect psychiatry") || e.contains("service cardiol") || e.contains("service hematol") || e.contains("service medical interna") ||
                        e.contains("service microbiol") || e.contains("service neumol") || e.contains("service neurol") || e.contains("service pediat") || e.contains("service reumatol") || e.contains("service urol") || e.contains("social work") || e.contains("state key laboratories") ||
                        e.contains("tehran medical science") || e.contains("urology service") || e.contains("biomed electrical") || e.contains("biomedical science") || e.contains("chemistry and biochemistry") || e.contains("civil & environment electrical") || e.contains("clinical medicine") ||
                        e.contains("clinical psychol") || e.contains("computer science and electrical engineering") || e.contains("electrical material research laboratories") || e.contains("escuela medical") || e.contains("health campus") || e.contains("hematol oncol") ||
                        e.contains("international joint laboratories for food safety") || e.contains("key laboratories optoelect devices & system") || e.contains("material science & electrical") || e.contains("medical oncol") || e.contains("nuclear medical") || e.contains("pediatric clinical") ||
                        e.contains("polit science") || e.contains("pulmonary and critical care medicine") || e.contains("sect cardiovasc medical") || e.contains("service dermatol") || e.contains("service pneumol") || e.contains("space science laboratories") || e.contains(" laboratory ") ||
                        e.contains(" institute ") || e.contains(" division ") || e.contains(" seminary ") || e.contains(" college ") || e.contains(" faculty ") || e.contains(" program ") || e.contains(" academy ") || e.contains(" center ") || e.contains(" school ") || e.contains(" centre ") ||
                        e.contains(" unit ") || e.contains(" hall ") || e.contains(" branch ") || e.contains("département") || e.contains(" institution ") || e.contains("department") || e.contains("neuroscience") || e.contains(" departments ") || e.contains("neurosurgery") ||
                        e.contains(" clinic ") || e.contains("dermatologie") || e.contains(" section ") || e.contains(" deparment ") || e.contains(" service ") || e.contains("departament") || e.contains("gynaecology") || e.contains(" surgery ") || e.contains("departamento") ||
                        e.contains("departement") || e.contains(" ward ")) {
                    result.add(t);
                }
            }
        }
        if (result.size() > 1) {
            result.remove("Department Medical");
        }
        return result;
    }

    public static Set<String> getHospSet() {
        Set<String> hospSet = new HashSet<>();
        hospSet.add("university medical center");
        hospSet.add("asan medical center");
        hospSet.add("beth israel deaconess medical center");
        hospSet.add("cedars sinai medical center");
        hospSet.add("cha bundang medical center");
        hospSet.add("chi mei medical center");
        hospSet.add("cleveland clinical");
        hospSet.add("dana farber cancer institute");
        hospSet.add("dartmouth hitchcock medical center");
        hospSet.add("h lee moffitt cancer center & research institute");
        hospSet.add("kanagawa cancer center");
        hospSet.add("mayo clinical");
        hospSet.add("md anderson cancer center");
        hospSet.add("memorial sloan kettering cancer center");
        hospSet.add("montefiore medical center");
        hospSet.add("netherlands cancer institute");
        hospSet.add("peter maccallum cancer center");
        hospSet.add("samsung medical center");
        hospSet.add("sheba medical center");
        hospSet.add("tufts medical center");
        hospSet.add("university nebraska medical center");
        hospSet.add("university texas southwestern medical center");
        hospSet.add("ut southwestern medical center");
        hospSet.add("women & childrens medical center");
        hospSet.add("hospital");
        hospSet.add("hosp");
        return hospSet;
    }

    public static String getUpData(String fuDan, String question, String fuDanOrStem, String user) {
        if (fuDan.isEmpty() || "1".equals(fuDan) || "2".equals(fuDan) || "3".equals(fuDan) || "4".equals(fuDan) || "5".equals(fuDan)) {
            String sendForJson = TongYiApi.sendFuDanJson(question, fuDanOrStem, user);
            List<En.UnitInfo> unitInfoList = new ArrayList<>();
            En.UnitInfo unitInfo = new En.UnitInfo();
            Matcher unitMatcher = Pattern.compile("\"dept\"\\s*:\\s*\"([^\"]*)\"").matcher(sendForJson);
            Matcher infoMatcher = Pattern.compile("\"info\"\\s*:\\s*\"([^\"]*)\"").matcher(sendForJson);
            if (unitMatcher.find()) {
                unitInfo.setUnit(unitMatcher.group(1).trim());
            }
            if (infoMatcher.find()) {
                unitInfo.setInfo(infoMatcher.group(1).trim());
            }
            if (!unitInfo.getUnit().isEmpty() || !unitInfo.getInfo().isEmpty()) {
                unitInfoList.add(unitInfo);
            }
            String upData = "";
            if (unitInfoList.isEmpty()) {
                if (fuDan.isEmpty()) {
                    upData = "1";
                } else if ("1".equals(fuDan)) {
                    upData = "2";
                } else if ("2".equals(fuDan)) {
                    upData = "3";
                }
            } else {
                upData = JSONUtil.toJsonStr(unitInfoList);
            }
//            System.out.println("sendForJson: " + sendForJson + " question: " + question + " unitInfoList: " + unitInfoList + " upData: " + upData);
            return upData;
        }
        return fuDan;
    }

//    public static void getChinaHospDept(String chinaHospTable, String autoId, String field, String chinaHospDeptTable) throws SQLException {
//        // 获取中国医院的科室，如果有"Department"信息，类型为2，有科室和C1的全写。如果没有，类型为1，只有C1的全写和出现的次数。
//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        int onePageNum = 1000;
//        List<Entity> tableNum = Db.use().query("select count(1) as count from " + chinaHospTable);
//        Map<String, Set<String>> deptAndC1SetMap = new ConcurrentHashMap<>();
//        Map<String, Integer> fullAndSumMap = new ConcurrentHashMap<>();
//        Db.use().execute("truncate table " + chinaHospDeptTable);
//        if (tableNum.get(0).getInt("count") > 0) {
//            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + chinaHospTable).intValue();
//            Collection<Integer> tableList = new ArrayList<>();
//            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
//            for (Integer startId : tableList) {
//                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + chinaHospTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
//                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + chinaHospTable + Utils.printMemoryStr() + "\033[0m");
//                for (Entity entry : tableData) {
//                    putMap(entry.getStr("c1_china_hosp_list"), deptAndC1SetMap, fullAndSumMap);
//                    putMap(entry.getStr("rp_china_hosp_list"), deptAndC1SetMap, fullAndSumMap);
//                }
//            }
//        }
//        deptAndC1SetMap.keySet().parallelStream().forEach(dept -> {
//            Set<String> set = deptAndC1SetMap.get(dept);
//            try {
//                Db.use().insert(Entity.create(chinaHospDeptTable).set("info", dept).set("c1s", JSONUtil.toJsonStr(set)).set("sum", set.size()).set("type", 2));
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        });
//        fullAndSumMap.keySet().parallelStream().forEach(full -> {
//            try {
//                Db.use().insert(Entity.create(chinaHospDeptTable).set("info", full).set("sum", fullAndSumMap.get(full)).set("type", 1));
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        });
//    }

//    public static void putMap(String c1ChinaHosp, Map<String, Set<String>> deptAndC1SetMap, Map<String, Integer> fullAndSumMap) {
//        if (null != c1ChinaHosp && c1ChinaHosp.contains("full")) {
//            List<En.C1Auth> c1ChinaHospList = JSONObject.parseArray(c1ChinaHosp, En.C1Auth.class);
//            for (En.C1Auth c1AuthUnitSort : c1ChinaHospList) {
//                String full = c1AuthUnitSort.getFull();
//                String[] split = full.replace("; ", ", ").replace(". ", ", ").split(", ");
//                boolean bool = true;
//                for (String dept : split) {
//                    dept = Utils.toTitleCase(dept).trim();
//                    if ((dept.contains(" Department ") || dept.startsWith("Department ") || dept.endsWith(" Department")) && dept.length() > 13 && !dept.contains("University") && !dept.contains("Hospital") && !"Department Medical".equals(dept)) {
//                        deptAndC1SetMap.compute(dept, (k, v) -> {
//                            if (v == null) {
//                                v = new ConcurrentHashSet<>();
//                            }
//                            v.add(full);
//                            return v;
//                        });
//                        bool = false;
//                        break;
//                    }
//                }
//                if (bool) {
//                    fullAndSumMap.compute(full, (key, value) -> value != null ? (value + 1) : 1);
//                }
//            }
//        }
//    }

    public static Map<String, En.Edu> getEduSubJectMap() {
        String s = "哲学_0101 哲学_01 哲学\n" +
                "应用伦理_0151 应用伦理_01 哲学\n" +
                "理论经济学_0201 理论经济学_02 经济学\n" +
                "应用经济学_0202 应用经济学_02 经济学\n" +
                "金融_0251 金融_02 经济学\n" +
                "应用统计_0252 应用统计_02 经济学\n" +
                "税务_0253 税务_02 经济学\n" +
                "国际商务_0254 国际商务_02 经济学\n" +
                "保险_0255 保险_02 经济学\n" +
                "资产评估_0256 资产评估_02 经济学\n" +
                "数字经济_0258 数字经济_02 经济学\n" +
                "法学_0301 法学_03 法学\n" +
                "政治学_0302 政治学_03 法学\n" +
                "社会学_0303 社会学_03 法学\n" +
                "民族学_0304 民族学_03 法学\n" +
                "马克思主义理论_0305 马克思主义理论_03 法学\n" +
                "公安学_0306 公安学_03 法学\n" +
                "中共党史党建学_0307 中共党史党建学_03 法学\n" +
                "纪检监察学_0308 纪检监察学_03 法学\n" +
                "法律_0351 法律_03 法学\n" +
                "社会工作_0352 社会工作_03 法学\n" +
                "警务_0353 警务_03 法学\n" +
                "知识产权_0354 知识产权_03 法学\n" +
                "国际事务_0355 国际事务_03 法学\n" +
                "教育学_0401 教育学_04 教育学\n" +
                "心理学_0402 心理学_04 教育学\n" +
                "体育学_0403 体育学_04 教育学\n" +
                "教育_0451 教育_04 教育学\n" +
                "体育_0452 体育_04 教育学\n" +
                "国际中文教育_0453 国际中文教育_04 教育学\n" +
                "应用心理_0454 应用心理_04 教育学\n" +
                "中国语言文学_0501 中国语言文学_05 文学\n" +
                "外国语言文学_0502 外国语言文学_05 文学\n" +
                "新闻传播学_0503 新闻传播学_05 文学\n" +
                "翻译_0551 翻译_05 文学\n" +
                "新闻与传播_0552 新闻与传播_05 文学\n" +
                "出版_0553 出版_05 文学\n" +
                "考古学_0601 考古学_06 历史学\n" +
                "中国史_0602 中国史_06 历史学\n" +
                "世界史_0603 世界史_06 历史学\n" +
                "博物馆_0651 博物馆_06 历史学\n" +
                "数学_0701 数学_07 理学\n" +
                "物理学_0702 物理学_07 理学\n" +
                "化学_0703 化学_07 理学\n" +
                "天文学_0704 天文学_07 理学\n" +
                "地理学_0705 地理学_07 理学\n" +
                "大气科学_0706 大气科学_07 理学\n" +
                "海洋科学_0707 海洋科学_07 理学\n" +
                "地球物理学_0708 地球物理学_07 理学\n" +
                "地质学_0709 地质学_07 理学\n" +
                "生物学_0710 生物学_07 理学\n" +
                "系统科学_0711 系统科学_07 理学\n" +
                "科学技术史_0712 科学技术史_07 理学\n" +
                "生态学_0713 生态学_07 理学\n" +
                "统计学_0714 统计学_07 理学\n" +
                "气象_0751 气象_07 理学\n" +
                "力学_0801 力学_08 工学\n" +
                "机械工程_0802 机械工程_08 工学\n" +
                "光学工程_0803 光学工程_08 工学\n" +
                "仪器科学与技术_0804 仪器科学与技术_08 工学\n" +
                "材料科学与工程_0805 材料科学与工程_08 工学\n" +
                "冶金工程_0806 冶金工程_08 工学\n" +
                "动力工程及工程热物理_0807 动力工程及工程热物理_08 工学\n" +
                "电气工程_0808 电气工程_08 工学\n" +
                "电子科学与技术_0809 电子科学与技术_08 工学\n" +
                "信息与通信工程_0810 信息与通信工程_08 工学\n" +
                "控制科学与工程_0811 控制科学与工程_08 工学\n" +
                "计算机科学与技术_0812 计算机科学与技术_08 工学\n" +
                "建筑学_0813 建筑学_08 工学\n" +
                "土木工程_0814 土木工程_08 工学\n" +
                "水利工程_0815 水利工程_08 工学\n" +
                "测绘科学与技术_0816 测绘科学与技术_08 工学\n" +
                "化学工程与技术_0817 化学工程与技术_08 工学\n" +
                "地质资源与地质工程_0818 地质资源与地质工程_08 工学\n" +
                "矿业工程_0819 矿业工程_08 工学\n" +
                "石油与天然气工程_0820 石油与天然气工程_08 工学\n" +
                "纺织科学与工程_0821 纺织科学与工程_08 工学\n" +
                "轻工技术与工程_0822 轻工技术与工程_08 工学\n" +
                "交通运输工程_0823 交通运输工程_08 工学\n" +
                "船舶与海洋工程_0824 船舶与海洋工程_08 工学\n" +
                "航空宇航科学与技术_0825 航空宇航科学与技术_08 工学\n" +
                "兵器科学与技术_0826 兵器科学与技术_08 工学\n" +
                "核科学与技术_0827 核科学与技术_08 工学\n" +
                "农业工程_0828 农业工程_08 工学\n" +
                "林业工程_0829 林业工程_08 工学\n" +
                "环境科学与工程_0830 环境科学与工程_08 工学\n" +
                "生物医学工程_0831 生物医学工程_08 工学\n" +
                "食品科学与工程_0832 食品科学与工程_08 工学\n" +
                "城乡规划学_0833 城乡规划学_08 工学\n" +
                "软件工程_0835 软件工程_08 工学\n" +
                "生物工程_0836 生物工程_08 工学\n" +
                "安全科学与工程_0837 安全科学与工程_08 工学\n" +
                "公安技术_0838 公安技术_08 工学\n" +
                "网络空间安全_0839 网络空间安全_08 工学\n" +
                "建筑_0851 建筑_08 工学\n" +
                "城乡规划_0853 城乡规划_08 工学\n" +
                "电子信息_0854 电子信息_08 工学\n" +
                "机械_0855 机械_08 工学\n" +
                "材料与化工_0856 材料与化工_08 工学\n" +
                "资源与环境_0857 资源与环境_08 工学\n" +
                "能源动力_0858 能源动力_08 工学\n" +
                "土木水利_0859 土木水利_08 工学\n" +
                "生物与医药_0860 生物与医药_08 工学\n" +
                "交通运输_0861 交通运输_08 工学\n" +
                "风景园林_0862 风景园林_08 工学\n" +
                "作物学_0901 作物学_09 农学\n" +
                "园艺学_0902 园艺学_09 农学\n" +
                "农业资源与环境_0903 农业资源与环境_09 农学\n" +
                "植物保护_0904 植物保护_09 农学\n" +
                "畜牧学_0905 畜牧学_09 农学\n" +
                "兽医学_0906 兽医学_09 农学\n" +
                "林学_0907 林学_09 农学\n" +
                "水产_0908 水产_09 农学\n" +
                "草学_0909 草学_09 农学\n" +
                "水土保持与荒漠化防治学_0910 水土保持与荒漠化防治学_09 农学\n" +
                "农业_0951 农业_09 农学\n" +
                "兽医_0952 兽医_09 农学\n" +
                "林业_0954 林业_09 农学\n" +
                "食品与营养_0955 食品与营养_09 农学\n" +
                "基础医学_1001 基础医学_10 医学\n" +
                "临床医学_1002 临床医学_10 医学\n" +
                "口腔医学_1003 口腔医学_10 医学\n" +
                "公共卫生与预防医学_1004 公共卫生与预防医学_10 医学\n" +
                "中医学_1005 中医学_10 医学\n" +
                "中西医结合_1006 中西医结合_10 医学\n" +
                "药学_1007 药学_10 医学\n" +
                "中药学_1008 中药学_10 医学\n" +
                "特种医学_1009 特种医学_10 医学\n" +
                "护理学_1011 护理学_10 医学\n" +
                "法医学_1012 法医学_10 医学\n" +
                "公共卫生_1053 公共卫生_10 医学\n" +
                "护理_1054 护理_10 医学\n" +
                "中药_1056 中药_10 医学\n" +
                "中医_1057 中医_10 医学\n" +
                "医学技术_1058 医学技术_10 医学\n" +
                "针灸_1059 针灸_10 医学\n" +
                "军事思想与军事历史_1101 军事思想与军事历史_11 军事学\n" +
                "战略学_1102 战略学_11 军事学\n" +
                "联合作战学_1103 联合作战学_11 军事学\n" +
                "军兵种作战学_1104 军兵种作战学_11 军事学\n" +
                "军队指挥学_1105 军队指挥学_11 军事学\n" +
                "军队政治工作学_1106 军队政治工作学_11 军事学\n" +
                "军事后勤学_1107 军事后勤学_11 军事学\n" +
                "军事装备学_1108 军事装备学_11 军事学\n" +
                "军事管理学_1109 军事管理学_11 军事学\n" +
                "军事训练学_1110 军事训练学_11 军事学\n" +
                "军事智能_1111 军事智能_11 军事学\n" +
                "联合作战指挥_1152 联合作战指挥_11 军事学\n" +
                "军兵种作战指挥_1153 军兵种作战指挥_11 军事学\n" +
                "作战指挥保障_1154 作战指挥保障_11 军事学\n" +
                "战时政治工作_1155 战时政治工作_11 军事学\n" +
                "后勤与装备保障_1156 后勤与装备保障_11 军事学\n" +
                "军事训练与管理_1157 军事训练与管理_11 军事学\n" +
                "管理科学与工程_1201 管理科学与工程_12 管理学\n" +
                "工商管理学_1202 工商管理学_12 管理学\n" +
                "农林经济管理_1203 农林经济管理_12 管理学\n" +
                "公共管理学_1204 公共管理学_12 管理学\n" +
                "信息资源管理_1205 信息资源管理_12 管理学\n" +
                "工商管理_1251 工商管理_12 管理学\n" +
                "公共管理_1252 公共管理_12 管理学\n" +
                "会计_1253 会计_12 管理学\n" +
                "旅游管理_1254 旅游管理_12 管理学\n" +
                "图书情报_1255 图书情报_12 管理学\n" +
                "工程管理_1256 工程管理_12 管理学\n" +
                "审计_1257 审计_12 管理学\n" +
                "艺术学_1301 艺术学_13 艺术学\n" +
                "音乐_1352 音乐_13 艺术学\n" +
                "舞蹈_1353 舞蹈_13 艺术学\n" +
                "戏剧与影视_1354 戏剧与影视_13 艺术学\n" +
                "戏曲与曲艺_1355 戏曲与曲艺_13 艺术学\n" +
                "美术与书法_1356 美术与书法_13 艺术学\n" +
                "设计_1357 设计_13 艺术学\n" +
                "集成电路科学与工程_1401 集成电路科学与工程_14 交叉学科\n" +
                "国家安全学_1402 国家安全学_14 交叉学科\n" +
                "设计学_1403 设计学_14 交叉学科\n" +
                "遥感科学与技术_1404 遥感科学与技术_14 交叉学科\n" +
                "智能科学与技术_1405 智能科学与技术_14 交叉学科\n" +
                "纳米科学与工程_1406 纳米科学与工程_14 交叉学科\n" +
                "区域国别学_1407 区域国别学_14 交叉学科\n" +
                "文物_1451 文物_14 交叉学科\n" +
                "密码_1452 密码_14 交叉学科";
        Map<String, En.Edu> eduSubJectMap = new HashMap<>();
        String[] split = s.split("\n");
        for (String t : split) {
            String[] list = t.split("_");
            if (list.length == 3) {
                En.Edu edu = new En.Edu();
                edu.setCategory(list[2]);
                edu.setSubject(list[1]);
                eduSubJectMap.put(list[0], edu);
            }
        }
        return eduSubJectMap;
    }

    /*
      教育部学科中的对应关系，0为通义使用和返回的，1为一级学科，2为学科门类，即最大的学科。
      哲学_0101 哲学_01 哲学
      应用伦理_0151 应用伦理_01 哲学
      理论经济学_0201 理论经济学_02 经济学
      应用经济学_0202 应用经济学_02 经济学
      金融_0251 金融_02 经济学
      应用统计_0252 应用统计_02 经济学
      税务_0253 税务_02 经济学
      国际商务_0254 国际商务_02 经济学
      保险_0255 保险_02 经济学
      资产评估_0256 资产评估_02 经济学
      数字经济_0258 数字经济_02 经济学
      法学_0301 法学_03 法学
      政治学_0302 政治学_03 法学
      社会学_0303 社会学_03 法学
      民族学_0304 民族学_03 法学
      马克思主义理论_0305 马克思主义理论_03 法学
      公安学_0306 公安学_03 法学
      中共党史党建学_0307 中共党史党建学_03 法学
      纪检监察学_0308 纪检监察学_03 法学
      法律_0351 法律_03 法学
      社会工作_0352 社会工作_03 法学
      警务_0353 警务_03 法学
      知识产权_0354 知识产权_03 法学
      国际事务_0355 国际事务_03 法学
      教育学_0401 教育学_04 教育学
      心理学_0402 心理学_04 教育学
      体育学_0403 体育学_04 教育学
      教育_0451 教育_04 教育学
      体育_0452 体育_04 教育学
      国际中文教育_0453 国际中文教育_04 教育学
      应用心理_0454 应用心理_04 教育学
      中国语言文学_0501 中国语言文学_05 文学
      外国语言文学_0502 外国语言文学_05 文学
      新闻传播学_0503 新闻传播学_05 文学
      翻译_0551 翻译_05 文学
      新闻与传播_0552 新闻与传播_05 文学
      出版_0553 出版_05 文学
      考古学_0601 考古学_06 历史学
      中国史_0602 中国史_06 历史学
      世界史_0603 世界史_06 历史学
      博物馆_0651 博物馆_06 历史学
      数学_0701 数学_07 理学
      物理学_0702 物理学_07 理学
      化学_0703 化学_07 理学
      天文学_0704 天文学_07 理学
      地理学_0705 地理学_07 理学
      大气科学_0706 大气科学_07 理学
      海洋科学_0707 海洋科学_07 理学
      地球物理学_0708 地球物理学_07 理学
      地质学_0709 地质学_07 理学
      生物学_0710 生物学_07 理学
      系统科学_0711 系统科学_07 理学
      科学技术史_0712 科学技术史_07 理学
      生态学_0713 生态学_07 理学
      统计学_0714 统计学_07 理学
      气象_0751 气象_07 理学
      力学_0801 力学_08 工学
      机械工程_0802 机械工程_08 工学
      光学工程_0803 光学工程_08 工学
      仪器科学与技术_0804 仪器科学与技术_08 工学
      材料科学与工程_0805 材料科学与工程_08 工学
      冶金工程_0806 冶金工程_08 工学
      动力工程及工程热物理_0807 动力工程及工程热物理_08 工学
      电气工程_0808 电气工程_08 工学
      电子科学与技术_0809 电子科学与技术_08 工学
      信息与通信工程_0810 信息与通信工程_08 工学
      控制科学与工程_0811 控制科学与工程_08 工学
      计算机科学与技术_0812 计算机科学与技术_08 工学
      建筑学_0813 建筑学_08 工学
      土木工程_0814 土木工程_08 工学
      水利工程_0815 水利工程_08 工学
      测绘科学与技术_0816 测绘科学与技术_08 工学
      化学工程与技术_0817 化学工程与技术_08 工学
      地质资源与地质工程_0818 地质资源与地质工程_08 工学
      矿业工程_0819 矿业工程_08 工学
      石油与天然气工程_0820 石油与天然气工程_08 工学
      纺织科学与工程_0821 纺织科学与工程_08 工学
      轻工技术与工程_0822 轻工技术与工程_08 工学
      交通运输工程_0823 交通运输工程_08 工学
      船舶与海洋工程_0824 船舶与海洋工程_08 工学
      航空宇航科学与技术_0825 航空宇航科学与技术_08 工学
      兵器科学与技术_0826 兵器科学与技术_08 工学
      核科学与技术_0827 核科学与技术_08 工学
      农业工程_0828 农业工程_08 工学
      林业工程_0829 林业工程_08 工学
      环境科学与工程_0830 环境科学与工程_08 工学
      生物医学工程_0831 生物医学工程_08 工学
      食品科学与工程_0832 食品科学与工程_08 工学
      城乡规划学_0833 城乡规划学_08 工学
      软件工程_0835 软件工程_08 工学
      生物工程_0836 生物工程_08 工学
      安全科学与工程_0837 安全科学与工程_08 工学
      公安技术_0838 公安技术_08 工学
      网络空间安全_0839 网络空间安全_08 工学
      建筑_0851 建筑_08 工学
      城乡规划_0853 城乡规划_08 工学
      电子信息_0854 电子信息_08 工学
      机械_0855 机械_08 工学
      材料与化工_0856 材料与化工_08 工学
      资源与环境_0857 资源与环境_08 工学
      能源动力_0858 能源动力_08 工学
      土木水利_0859 土木水利_08 工学
      生物与医药_0860 生物与医药_08 工学
      交通运输_0861 交通运输_08 工学
      风景园林_0862 风景园林_08 工学
      作物学_0901 作物学_09 农学
      园艺学_0902 园艺学_09 农学
      农业资源与环境_0903 农业资源与环境_09 农学
      植物保护_0904 植物保护_09 农学
      畜牧学_0905 畜牧学_09 农学
      兽医学_0906 兽医学_09 农学
      林学_0907 林学_09 农学
      水产_0908 水产_09 农学
      草学_0909 草学_09 农学
      水土保持与荒漠化防治学_0910 水土保持与荒漠化防治学_09 农学
      农业_0951 农业_09 农学
      兽医_0952 兽医_09 农学
      林业_0954 林业_09 农学
      食品与营养_0955 食品与营养_09 农学
      基础医学_1001 基础医学_10 医学
      临床医学_1002 临床医学_10 医学
      口腔医学_1003 口腔医学_10 医学
      公共卫生与预防医学_1004 公共卫生与预防医学_10 医学
      中医学_1005 中医学_10 医学
      中西医结合_1006 中西医结合_10 医学
      药学_1007 药学_10 医学
      中药学_1008 中药学_10 医学
      特种医学_1009 特种医学_10 医学
      护理学_1011 护理学_10 医学
      法医学_1012 法医学_10 医学
      公共卫生_1053 公共卫生_10 医学
      护理_1054 护理_10 医学
      中药_1056 中药_10 医学
      中医_1057 中医_10 医学
      医学技术_1058 医学技术_10 医学
      针灸_1059 针灸_10 医学
      军事思想与军事历史_1101 军事思想与军事历史_11 军事学
      战略学_1102 战略学_11 军事学
      联合作战学_1103 联合作战学_11 军事学
      军兵种作战学_1104 军兵种作战学_11 军事学
      军队指挥学_1105 军队指挥学_11 军事学
      军队政治工作学_1106 军队政治工作学_11 军事学
      军事后勤学_1107 军事后勤学_11 军事学
      军事装备学_1108 军事装备学_11 军事学
      军事管理学_1109 军事管理学_11 军事学
      军事训练学_1110 军事训练学_11 军事学
      军事智能_1111 军事智能_11 军事学
      联合作战指挥_1152 联合作战指挥_11 军事学
      军兵种作战指挥_1153 军兵种作战指挥_11 军事学
      作战指挥保障_1154 作战指挥保障_11 军事学
      战时政治工作_1155 战时政治工作_11 军事学
      后勤与装备保障_1156 后勤与装备保障_11 军事学
      军事训练与管理_1157 军事训练与管理_11 军事学
      管理科学与工程_1201 管理科学与工程_12 管理学
      工商管理学_1202 工商管理学_12 管理学
      农林经济管理_1203 农林经济管理_12 管理学
      公共管理学_1204 公共管理学_12 管理学
      信息资源管理_1205 信息资源管理_12 管理学
      工商管理_1251 工商管理_12 管理学
      公共管理_1252 公共管理_12 管理学
      会计_1253 会计_12 管理学
      旅游管理_1254 旅游管理_12 管理学
      图书情报_1255 图书情报_12 管理学
      工程管理_1256 工程管理_12 管理学
      审计_1257 审计_12 管理学
      艺术学_1301 艺术学_13 艺术学
      音乐_1352 音乐_13 艺术学
      舞蹈_1353 舞蹈_13 艺术学
      戏剧与影视_1354 戏剧与影视_13 艺术学
      戏曲与曲艺_1355 戏曲与曲艺_13 艺术学
      美术与书法_1356 美术与书法_13 艺术学
      设计_1357 设计_13 艺术学
      集成电路科学与工程_1401 集成电路科学与工程_14 交叉学科
      国家安全学_1402 国家安全学_14 交叉学科
      设计学_1403 设计学_14 交叉学科
      遥感科学与技术_1404 遥感科学与技术_14 交叉学科
      智能科学与技术_1405 智能科学与技术_14 交叉学科
      纳米科学与工程_1406 纳米科学与工程_14 交叉学科
      区域国别学_1407 区域国别学_14 交叉学科
      文物_1451 文物_14 交叉学科
      密码_1452 密码_14 交叉学科
     */


}
